package double_point;

/**
 * 209. 长度最小的子数组
 * 数组双指针
 *
 * @author Api
 * @date 2023/10/5 17:26
 */
public class Code209_MinimumLengthSubarray {
    public int minSubArrayLen(int target, int[] nums) {
        int left = 0;
        int right = 0;
        int curSum = 0;
        int minLength = 0;
        while (right < nums.length) {
            curSum = curSum + nums[right];
            while (curSum >= target) {
                if (right - left + 1 < minLength || minLength == 0) {
                    minLength = right - left + 1;
                }
                curSum = curSum - nums[left];
                left++;
            }
            right++;
        }
        return minLength;
    }

    // 另外一种写法
    public int minSubArrayLen1(int target, int[] nums) {
        int i = 0; // 滑动窗口起始位置
        int result = Integer.MAX_VALUE;
        int subLength = 0; // 滑动窗口的长度
        int sum = 0; // 滑动窗口数值之和
        for (int j = 0; j < nums.length; j++) {
            sum += nums[j];
            // 注意这里使用while，每次更新 i（起始位置），并不断比较子序列是否符合条件
            while (sum >= target) {
                subLength = j - i + 1; // 取子序列的长度
                result = Math.min(result, subLength);
                sum = sum - nums[i]; //sum -= nums[i++]; // 这里体现出滑动窗口的精髓之处，不断变更i（子序列的起始位置）
                i++;
            }
        }
        // 如果result没有被赋值的话，就返回0，说明没有符合条件的子序列
        return result == Integer.MAX_VALUE ? 0 : result;
    }
}
